﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.IO;
using DataAccessComponents;
using BusinessLogicLayer;
using System.Collections.ObjectModel;
using Microsoft.Windows.Controls;
using System.Drawing;

namespace inzDesktop
{
    /// <summary>
    /// Interaction logic for windowDodajHotel.xaml
    /// </summary>
    public partial class windowDodajHotel : Window
    {
     /// <summary>
        /// Lista zdjec do usunięcia
        /// </summary>
        private List<ListBoxItem> listaZdjec = new List<ListBoxItem>();
        public windowDodajHotel()
        {
            InitializeComponent();
            inicjalizacjaComboBox();
            
        }

        private void inicjalizacjaComboBox()
        {
            // Ustawianie standarów hotelu
            string[] standard = {"1","2","3","4","5"};
            cbStandard.ItemsSource = standard;

            // Pobieranie miast
            MiastoBL miastoBL = new MiastoBL();
            cbMiasto.ItemsSource = miastoBL.pobierzListe();

            // Pobieranie wyzywienia
            WyzywienieBL wyzywieniaBL = new WyzywienieBL();
            cbWyzywienie.ItemsSource = wyzywieniaBL.pobierzListe();
        
        }

        public void wyswietlaSzczegolyHotelu(int idHotel)
        {
            HotelBL hotelBL = new HotelBL();
            Hotel hotel = new Hotel();
            // Ustawianie hotelu w celu wykrycia zmian
            hotel.Czy_zmiana = false;
            ZdjecieBL zdjeciaBL = new ZdjecieBL();
            uzupelnijListBox(ref listBoxGaleria, zdjeciaBL.pobierzListe(hotel.Id_galeria));
            


            this.DataContext = hotel;

        }

        private void uzupelnijListBox(ref ListBox listBox, ObservableCollection<Zdjecie> listaZdjec)
        {
            ZdjecieBL zjecieBL = new ZdjecieBL();
            ListBoxItem listBoxItem;
            foreach (Zdjecie zdjecie in listaZdjec)
            {
                listBoxItem = new ListBoxItem();
                listBoxItem.ToolTip = zdjecie.Id_zdjecia;
                System.Windows.Controls.Image tmp = new System.Windows.Controls.Image();            
                tmp.Source = zjecieBL.pobierzBitmapImage(zdjecie.Id_zdjecia);
                tmp.Width = 150;

                Border br = new Border();
                br.BorderBrush = new SolidColorBrush(Colors.Gray);
                br.BorderThickness = new Thickness(2);
                br.Margin = new Thickness(5);
                br.Padding = new Thickness(3);
                br.Child = tmp;

                listBoxItem.Content = br;
                
                listBox.Items.Add(listBoxItem);
               
            }
        }

        private void dodajObraz(string nazwaPliku)
        {
            ListBoxItem fileItem = new ListBoxItem();
            //fileItem.Content = System.IO.Path.GetFileNameWithoutExtension(droppedFilePath);
            System.Windows.Controls.Image tmp = new System.Windows.Controls.Image();
            // Zapisywanie ścieżki do pliku
            fileItem.ToolTip = nazwaPliku;

            // Wczytywanie obrazka do bitmapy
            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(nazwaPliku);


            System.Drawing.Image imageZrodlowy = System.Drawing.Image.FromFile(nazwaPliku);
           

            // Wczytywanie obrazu do strumienia
            MemoryStream ms = new MemoryStream();
            imageZrodlowy.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            ms.Position = 0;

            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.BeginInit();
            bitmapImage.StreamSource = ms;
            bitmapImage.EndInit();

            tmp.Source = bitmapImage;
            tmp.Width = 150;

            Border br = new Border();
            br.BorderBrush = new SolidColorBrush(Colors.Gray);
            br.BorderThickness = new Thickness(2);
            br.Margin = new Thickness(5);
            br.Padding = new Thickness(3);
            br.Child = tmp;


            fileItem.Content = br;

            listBoxGaleria.Items.Add(fileItem);
        }
       

        private void FilesDropped(object sender, System.Windows.DragEventArgs e)
        {
            // TODO: Add event handler implementation here.
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                //DropListBox.Items.Clear();
                string[] droppedFilePaths = e.Data.GetData(DataFormats.FileDrop, true) as string[];
                foreach (string droppedFilePath in droppedFilePaths)
                {
                    dodajObraz(droppedFilePath);
                }
            }
        }

        /// <summary>
        /// Zapisywanie zmian w hotelu
        /// </summary>
        private void zapiszZmianyWHotelu()
        {

            Hotel hotel = (Hotel)this.DataContext;
            HotelBL hotelBL = new HotelBL();

            int idHotelu = hotelBL.dodaj(hotel);

            hotel = hotelBL.pobierz(idHotelu);
            this.DataContext = hotel;
            zapiszZmianyWGaleria(hotel.Id_galeria);
        }

        private void zapiszZmianyWGaleria(int idGaleria)
        {
            ZdjecieBL zdjecieBL = new ZdjecieBL();
            Galeria_ZdjeciaBL gzBL = new Galeria_ZdjeciaBL();
            Galeria_Zdjecia gz = new Galeria_Zdjecia();
            Zdjecie zdjecie = new Zdjecie();


            // Zapisywanie nowododanych zdjeć
            foreach (ListBoxItem lbi in listBoxGaleria.Items)
            {
                // True jeżeli wartość zawiera ścieżke do pliku
                string sciezka = lbi.ToolTip.ToString();
                bool zmienna = System.IO.Path.IsPathRooted(sciezka);
                if (zmienna == true)
                {
                    int idZdjecie = zdjecieBL.dodaj(System.IO.Path.GetFileNameWithoutExtension(sciezka), sciezka);
                    gz.Id_galeria = idGaleria;
                    gz.Id_zdjecia = idZdjecie;

                    gzBL.dodaj(gz);
                }
            }

            // Zapisywanie zmian w galerii, usuwanie zdjec z bazy danych            
            foreach (ListBoxItem lbi in listaZdjec)
            {
                zdjecieBL.usun(Convert.ToInt32(lbi.ToolTip));
            }
            
        }
             

        private void zdjecieGlowne_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {

        }

        private void btnOk_Click(object sender, RoutedEventArgs e)
        {

            if (Validacja.IsValid(gridHotelOpis) && Validacja.IsValid(gridHotelGaleria))
            {
                if (((Hotel)this.DataContext).Czy_zmiana == true)
                {
                    System.Windows.MessageBoxResult wynik = System.Windows.MessageBox.Show("Czy zapisać zmiany?", "Uwaga!", MessageBoxButton.YesNoCancel, MessageBoxImage.Question);
                    if (wynik == MessageBoxResult.Yes)
                    {
                        zapiszZmianyWHotelu();
                        this.Close();
                    }
                    else if (wynik == MessageBoxResult.No)
                    {
                        this.Close();
                    }
                }
                else
                    this.Close();
            }
            else
                System.Windows.MessageBox.Show("Wprowadzone zostały niepoprawne dane.", "Błąd", MessageBoxButton.OK, MessageBoxImage.Error);
            
        }

        private void btnAnuluj_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnZastosuj_Click(object sender, RoutedEventArgs e)
        {
            zapiszZmianyWHotelu();
            System.Windows.MessageBox.Show("Zmiany zapisane pomyślnie", "Sukces", MessageBoxButton.OK, MessageBoxImage.Information);
        }

        private void cbMiasto_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            KrajBL krajBL = new KrajBL();
            MiastoBL miastoBL = new MiastoBL();
            
            tbKraj.Text = krajBL.pobierz(miastoBL.pobierz(((Miasto)cbMiasto.SelectedItem).Id_miasta).Id_kraju).Nazwa;
        }

        private void btnDodajZdjecia_Click(object sender, RoutedEventArgs e)
        {
            Microsoft.Win32.OpenFileDialog dialog = new Microsoft.Win32.OpenFileDialog();
            // Ustawianie rodzaju plików
            dialog.Filter = "Obrazy (*.jpg,*.png) |*.jpg;*.png";
            dialog.Multiselect = true;


            if (dialog.ShowDialog() == true)
            {
                foreach (String str in dialog.FileNames)
                {
                    dodajObraz(str);
                }
            }
            
        }

        private void btnUsunZdjecia_Click(object sender, RoutedEventArgs e)
        {
            foreach (ListBoxItem lbi in listBoxGaleria.SelectedItems)
            {
                listaZdjec.Add(lbi);
            }
            foreach (ListBoxItem lb in listaZdjec)
            {
                listBoxGaleria.Items.Remove(lb);
            }
            Hotel tmp = (Hotel)this.DataContext;
            tmp.Czy_zmiana = true;
            this.DataContext = tmp;
        }

        private void _richTextBoxSkrot_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextRange tr = new TextRange(_richTextBoxSkrot.Document.ContentStart, _richTextBoxSkrot.Document.ContentEnd);
            lblIloscZnakowOpisSkrotKraj.Content = string.Format("Pozostało znaków: {0}", 300 - tr.Text.Length);
            if (tr.Text.Length > 300)
            {
                System.Windows.MessageBox.Show("Wprowadzony opis skrócony jest zadługi", "Uwaga", MessageBoxButton.OK, MessageBoxImage.Warning);
                string tmp = tr.Text.Remove(298);
                new TextRange(_richTextBoxSkrot.Document.ContentStart, _richTextBoxSkrot.Document.ContentEnd).Text = tmp;
            }
        }       
    }

   
}
